有两个相关的C标准规则:
C99标准,6.3.2.3
:
指向void的指针可以转换为指向任何不完整或对象类型的指针.指向任何不完整或对象类型的指针可能会转换为指向void的指针并再次返回; 结果应该等于原始指针.
而且7.20.1.4
:
以下类型指定一个无符号整数类型,其属性是任何有效的void指针都可以转换为此类型,然后转换回指向void的指针,结果将等于原始指针:
uintptr_t
这意味着,以下代码符合:
int *p = NULL; void *q = (void*)p; uintptr_t s = (uintptr_t)q;
但它真的需要两步演员吗?如果执行以下操作,编译器是否会执行隐式中间转换:
int *p = NULL; uintptr_t s = (uintptr_t)p;
(好吧,它可能会出现在大多数编译器上,但我的问题是关于标准符合性)
我不会冒险.该标准清楚地表明了允许的内容和不允许的内容.
uintptr_t s = (uintptr_t)(void*)p;
向你的代码的读者写信,你知道你在做什么.